package com.iwhalecloud.bss.kite.cucc.service.attr.handler;

import com.google.common.collect.Lists;
import com.iwhalecloud.bss.kite.common.constant.KeyConsts;
import com.iwhalecloud.bss.kite.common.util.KiteListUtils;
import com.iwhalecloud.bss.kite.common.util.KiteStringUtils;
import com.iwhalecloud.bss.kite.cucc.common.constant.LocalKeyConsts;
import com.iwhalecloud.bss.kite.dataservice.cache.DcPublicCache;
import com.iwhalecloud.bss.kite.manager.api.IOperateSceneInstService;
import com.iwhalecloud.bss.kite.manager.api.IQuerySceneInstService;
import com.iwhalecloud.bss.kite.manager.inst.KiteAttr;
import com.iwhalecloud.bss.kite.manager.inst.KiteInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInst;
import com.iwhalecloud.bss.kite.manager.inst.KiteProdInstFunc;
import com.iwhalecloud.bss.kite.service.attr.AttrData;
import com.iwhalecloud.bss.kite.service.attr.handler.AbstractAttrHandler;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 *
 */

public class RatePlanModeDealAttrHandler extends AbstractAttrHandler<KiteProdInst, AttrData> {
    @Autowired
    private IQuerySceneInstService querySceneInstService;

    @Autowired
    IOperateSceneInstService operateSceneInstService;
    @Override
    public void onShow(KiteAttr attr, KiteProdInst inst, AttrData data) {
        linkClearValue(attr,inst,data);
    }
   /* @Override
    public void after(KiteAttr attr, KiteProdInst inst, AttrData data) {
        linkClearValue(attr,inst,data);
    }*/
    private void linkClearValue(KiteAttr attr, KiteProdInst inst, AttrData data) {
        String value = attr.getValue();
        List<KiteProdInstFunc> zfKiteProdInstFuncs = querySceneInstService
            .listProdInstFuncsByProdId(data.getCustId(), inst.getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_ZF);
        if (KiteListUtils.isEmpty(zfKiteProdInstFuncs)) {
            zfKiteProdInstFuncs = querySceneInstService
                .listProdInstFuncsByProdId(data.getCustId(), inst.getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_NBZF);
        }
        if (KiteListUtils.isEmpty(zfKiteProdInstFuncs)) {
            zfKiteProdInstFuncs = querySceneInstService
                .listProdInstFuncsByProdId(data.getCustId(), inst.getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_5GZF);
        }
        if (KiteListUtils.isEmpty(zfKiteProdInstFuncs)) {
            zfKiteProdInstFuncs = querySceneInstService
                .listProdInstFuncsByProdId(data.getCustId(), inst.getProdInstId(), LocalKeyConsts.FUNC_PROD_ID_YF5GZF);
        }
        if (KiteListUtils.isEmpty(zfKiteProdInstFuncs)) {
            zfKiteProdInstFuncs = getBaseNewFuncProd(data);
        }
        if (KiteListUtils.isNotEmpty(zfKiteProdInstFuncs)) {
            //                月付单个连接 100006431
            //                月付灵活共享 100006432
            //                预付单个连接 100006433
            //                预付灵活共享 100006434
            //                SIM卡计费带宽限期(天) 200003683  -> 通信套包类型为：月付单个连接、月付灵活共享时展示
            //                SIM卡激活起最短连续计费期限(月)200003684 -> 通信套包类型为：月付单个连接、月付灵活共享时展示
            //                激活首月订购费收费方式200003685 ->通信套包类型为：月付单个连接、月付灵活共享时展示
            //                SIM卡激活承诺期(天)200004032 ->通信套包类型为：预付单个连接、预付灵活共享展示
            //                到期续约模式200004026 ->“通信套包类型”选择“预付单个连接”“预付灵活共享”时展示

            boolean showFlag = false;
            for (KiteProdInstFunc funcInst : zfKiteProdInstFuncs) {
                // 200003697 通信套包类型
                String attrValue = funcInst.getAttrValue("200003697");
                if (KiteStringUtils.isEmpty(attrValue)) {
                    // 200004179 资费套包类型
                    attrValue = funcInst.getAttrValue("200004179");
                }
                if ("100006433".equals(attrValue) || "100006434".equals(attrValue) || "100007470".equals(attrValue)) {
                    showFlag = true;
                }
                if (showFlag) {
                    break;
                }
            }

            if (showFlag) {
                attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                attr.setIsNull(KeyConsts.IFTRUE_F);
                if (KiteStringUtils.isEmpty(value)) {
                    attr.setValue(attr.getDefaultValue());
                    attr.setValueDesc(this.getValueDesc(attr, inst, value, data));
                }

                // 如果是到期续约模式200004026 需要联动设置指定续约计划 必填，显示
                if ("200004026".equals(attr.getFieldName()) && "100006987".equals(attr.getValue())) {
                    KiteAttr attr1 = inst.getAttr("200004027");
                    if (Objects.nonNull(attr1)) {
                        attr1.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_M);
                        attr1.setIsNull(KeyConsts.IFTRUE_F);
                    }
                }

            }
            else {
                attr.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                attr.setIsNull(KeyConsts.IFTRUE_T);
                attr.setValue("");
                attr.setValueDesc("");
                if ("200004026".equals(attr.getFieldName())) {
                    KiteAttr attr1 = inst.getAttr("200004027");
                    if (Objects.nonNull(attr1)) {
                        attr1.setShowType(KeyConsts.PROD_ATTR_SHOW_TYPE_E);
                        attr1.setIsNull(KeyConsts.IFTRUE_T);
                        attr1.setValue("");
                        attr1.setValueDesc("");
                    }
                }
            }

        }
        else {
            attr.setShowType("E");
            attr.setValue("");
            attr.setValueDesc("");
        }

        operateSceneInstService.setAttr(data.getSceneInstId(), inst.getInstType(), inst.getInstId(), attr);
    }
    private List<KiteProdInstFunc> getBaseNewFuncProd(AttrData data) {
        List<KiteProdInstFunc> zfKiteProdInstFuncs = Lists.newArrayList(); // 取所有接入类产品
        List<KiteProdInst> kiteProdInstList = querySceneInstService.listProdInsts(data.getSceneInstId());
        final KiteProdInst[] prodInsts = new KiteProdInst[1];
        List<KiteProdInst> prodInstList = Lists.newArrayList();
        String zfStr = DcPublicCache.getCodea("202012170001","zf_base_inst");
        if (KiteListUtils.isNotEmpty(kiteProdInstList)) {
            kiteProdInstList.stream().forEach(prodInst -> {
                List<KiteProdInstFunc> kiteProdInstFuncs = querySceneInstService
                    .listProdInstFuncs(data.getCustId(), prodInst.getProdInstId());
                if (KiteListUtils.isNotEmpty(kiteProdInstFuncs)) {
                    kiteProdInstFuncs.stream().forEach(kiteProdInstFunc -> {
                        if (KiteStringUtils.indexOf(zfStr, kiteProdInstFunc.getProdId())>-1) {
                            prodInstList.add(prodInst);
                        }
                    });
                }
            });
        }
        if (KiteListUtils.isNotEmpty(prodInstList)) {
            String[] str = zfStr.split("/");
            for (KiteProdInst kiteProdInst : prodInstList) {
                List<KiteProdInstFunc> kiteProdInstFuncList = new ArrayList<>();
                for(String prodId : str){
                    kiteProdInstFuncList = querySceneInstService
                        .listProdInstFuncsByProdId(data.getCustId(), kiteProdInst.getProdInstId(), prodId);
                    if(KiteListUtils.isNotEmpty(kiteProdInstFuncList)){
                        zfKiteProdInstFuncs.addAll(kiteProdInstFuncList);
                    }
                }
            }
        }
        zfKiteProdInstFuncs = zfKiteProdInstFuncs.stream().filter(distinctByKey(b -> b.getProdInstId())).collect(Collectors.toList());
        return zfKiteProdInstFuncs;
    }
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        ConcurrentHashMap<Object, Boolean> map = new ConcurrentHashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}
